package com.itheima.datastructure;

import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;

public class DynamicArray implements Iterable<Integer> {
    private int size = 0;       // 逻辑大小
    private int capacity = 8;   // 容量
    private int[] array = {};

    /**
     * 向最后位置[size]添加元素
     *
     * @param element-待添加元素
     */
    public void addLast(int element) {
//        array[size] = element;
//        size++;
        add(size, element);
    }

    /**
     * 向[0..size位置添加元素]
     *
     * @param index-索引位置
     * @param element-待添加元素
     */
    public void add(int index, int element) {
        checkAndGrow();
        // 添加逻辑
        if (index >= 0 && index < size) {
            // 向后挪动, 空出待插入位置
            System.arraycopy(array, index, array, index + 1, size - index);
        }
        array[index] = element;
        size++;
    }

    private void checkAndGrow() {
        // 容量检查
        if( size == 0){
            array = new int[capacity];
        }
        if(size == capacity){
            // 扩容
            capacity += capacity >>> 1 ;
            int[] newArray = new int[capacity];
            System.arraycopy(array, 0, newArray, 0, size);
            array = newArray;
        }
    }

    public int remove(int index){  //[0,size)
        int removed = array[index];
        if(index < size - 1) {
            System.arraycopy(array, index + 1, array, index, size - (index + 1));
            size--;
        }
        return removed;
    }

    public int get(int index) { // [0..size)
        return array[index];
    }

    /**
     * 遍历方法1
     * @param consumer-遍历都要执行的操作,入参:每个元素
     */
    public void myforEach(Consumer<Integer> consumer) {
        for (int i = 0; i < array.length; i++) {
            consumer.accept(array[i]);
        }
    }

    /**
     * 遍历方法2-迭代器遍历
     * @return
     */
    @Override
    public Iterator iterator() {
        return new Iterator() {
            int i = 0;

            @Override
            public boolean hasNext() {  // 有没有下一个元素
                return i < size;
            }

            @Override
            public Object next() {  // 返回当前元素,并移动到下一个元素
                return array[i++];
            }
        };
    }

    /**
     * 遍历方法3-Steam流遍历
     * @return
     */
    public IntStream stream(){
        return IntStream.of(Arrays.copyOfRange(array, 0, size));
    }

}
